#include "input_ring_buffer.h"
#include "app_log.h"
#include "cdn_light.h"

static InputEventBuffer g_tInputBuffer;
static KeyInputBuffer g_tKeyInputBuffer;

/**********************************************************************
 * 函数名称： PutOtherInputEvent
 * 功能描述： 往环形缓冲区放入数据
 * 输入参数： ptInputEvent-输入事件
 * 输出参数： 无
 * 返 回 值： 0：成功, 其他值：失败
 ***********************************************************************/
uint8_t PutOtherInputEvent(PInputEvent ptInputEvent)
{
  uint32_t i = (g_tInputBuffer.other_pW + 1) % OTHER_BUFFER_SIZE;

  //防御式编程
  if (!ptInputEvent)
  {
    return 1;
  }

  if(i != g_tInputBuffer.other_pR)    // 环形缓冲区没有写满
  {
    g_tInputBuffer.buffer[g_tInputBuffer.other_pW] = *ptInputEvent;
    g_tInputBuffer.other_pW = i;
    return 0;
  }
  return 1;
}

/**********************************************************************
 * 函数名称： PutKeyInputEvent
 * 功能描述： 往按键缓冲区放入数据
 * 输入参数： ptKeyEvent-输入事件
 * 输出参数： 无
 * 返 回 值： 0：成功, 其他值：失败
 ***********************************************************************/
uint8_t PutKeyInputEvent(PKeyInputEvent ptKeyEvent)
{
    //防御式编程
  if (!ptKeyEvent)
  {
    return 1;
  }

  g_tKeyInputBuffer.key_buffer[0] = *ptKeyEvent;
  g_tKeyInputBuffer.key_Write = 1;
  //TRACE("zsm: PutKeyInputEvent key_Write = %d\r\n", g_tKeyInputBuffer.key_Write);
  return 0;
}

/**********************************************************************
 * 函数名称： GetOtherInputEvent
 * 功能描述： 从环形缓冲区读取数据
 * 输入参数： 无
 * 输出参数： ptInputEvent-用来保存输入事件
 * 返 回 值： 0：成功, 其他值：失败
 ***********************************************************************/
uint8_t GetOtherInputEvent(PInputEvent ptInputEvent)
{
  //防御式编程
  if (!ptInputEvent)
  {
    return 1;
  }

  //环形缓冲区空, 则返回1
  if(g_tInputBuffer.other_pR == g_tInputBuffer.other_pW)
  {
    return 1;
  }
  else
  {
    *ptInputEvent = g_tInputBuffer.buffer[g_tInputBuffer.other_pR];
    g_tInputBuffer.other_pR = (g_tInputBuffer.other_pR + 1) % OTHER_BUFFER_SIZE;
    return 0;
  }
}

/**********************************************************************
 * 函数名称： GetKeyInputEvent
 * 功能描述： 从按键缓冲区读取按键数据
 * 输入参数： 无
 * 输出参数： ptKeyEvent-用来保存输入事件
 * 返 回 值： 0：成功, 其他值：失败
 ***********************************************************************/
uint8_t GetKeyInputEvent(PKeyInputEvent ptKeyEvent)
{
  //防御式编程
  if (!ptKeyEvent)
  {
    return 1;
  }

  //无数据, 则返回1
  if(g_tKeyInputBuffer.key_Write == 0)
  {
    return 1;
  }
  else
  {
    *ptKeyEvent = g_tKeyInputBuffer.key_buffer[0];

    if((*ptKeyEvent).iKey.result == KEY_RESULT_LONG_DOWN || (*ptKeyEvent).iKey.result == KEY_RESULT_LONG_DOWN_UP)
    {
      //TRACE("zsm: GetKeyInputEvent KEY_RESULT_LONG_DOWN or KEY_RESULT_LONG_DOWN_UP\r\n");
      g_tKeyInputBuffer.key_Write = 0;
      return 0;
    }
    else
    {
      //TRACE("zsm: GetKeyInputEvent KEY_RESULT_CLICK_UP\r\n");
      g_tKeyInputBuffer.key_Write = 0;
      return 0;
    }
  }
  return 1;
}

